﻿//////////////////////////////////////////////////////////////////////////////
//
//  Copyright © 1998-2024 Glodon Company Limited.  All rights reserved.
//
//  Use of this software is subject to the terms of the Glodon license
//  agreement provided at the time of installation or download, or which
//  otherwise accompanies this software in either electronic or hard copy form.  
//
//////////////////////////////////////////////////////////////////////////////


#pragma once
#include "IExternalObject.h"
#include "GmFamilyService.h"
#include "IGraphicsStyleData.h"

namespace gcmp
{
    class IVisibilityTypeFlags;
}

namespace gfam
{
    /// \brief 族填充区域对象
    ///
    class  GM_FAMILY_SERVICE_EXPORT IFamilyFilledRegion : public gcmp::IExternalObject
    {
        DEFINE_CAST_DERIVED(gfam::IFamilyFilledRegion, gcmp::IExternalObject)
    public:
        /// \brief 创建填充区域
        ///
        /// \param pDocument 文档指针
        /// \param modelViewId  填充区域所在视图的ElementId
        /// \param sketchId 草图的ElementId
        /// \param fillPatternName 填充模式的名字
        /// \return 返回创建的填充区域指针
        /// \note 草图平面数据应是更新后的
        static IFamilyFilledRegion* Create(gcmp::IDocument *pDocument,
            const gcmp::ElementId& modelViewId,
            const gcmp::ElementId& sketchId,
            const std::wstring& fillPatternName);

        /// \brief 创建遮罩区域，在项目中表现为智能同色的壳，依据深度关系进行遮挡
        ///
        /// \param pDocument 文档指针
        /// \param modelViewId  遮罩区域所在视图的ElementId
        /// \param sketchId 草图的ElementId
        /// \return 返回创建的遮罩区域指针
        /// \note 草图平面数据应是更新后的；遮罩在构件创建时行为类似填充，按渲染优先级遮挡
        static IFamilyFilledRegion* CreateAsMaskRegion(gcmp::IDocument *pDocument, const gcmp::ElementId &modelViewId, const gcmp::ElementId &sketchId);

        /// \brief 获取可见性标记,用户可通过操作此返回值对可见性进行修改
        ///
        /// \return 返回可见性标记指针
        virtual const gcmp::IVisibilityTypeFlags* GetVisibilityTypeFlagsInHostDocument() const = 0;

        /// \brief 获取可见性标记,用户可通过操作此返回值对可见性进行修改
        ///
        /// \return 返回可见性标记指针
        virtual gcmp::IVisibilityTypeFlags* GetVisibilityTypeFlagsInHostDocument() = 0;

        /// \brief 获取填充区域所在视图的ElementId
        ///
        /// \return 填充区域所在视图的ElementId
        virtual gcmp::ElementId GetModelViewId() const = 0;

        /// \brief 设置填充区域所在视图的ElementId
        ///
        /// \param 填充区域所在视图的ElementId
        virtual void SetModelViewId(const gcmp::ElementId &viewId) = 0;

        /// \brief 获取二维填充区域在项目中是否可见
        ///
        /// \return 当返回值为true时，表明在项目中可见。否则，在项目中不可见。
        virtual bool GetIsVisiableInParentDocument() const = 0;

        /// \brief 获得填充图案的智能颜色模式
        ///
        /// \return 获得的填充图案的智能颜色模式
        virtual gcmp::SmartColorMode GetSmartColorMode() const = 0;

        /// \brief 设置填充图案的智能颜色模式
        /// 
        /// \param smartColorMode 设置的填充图案的智能颜色模式
        /// \return 成功与否
        virtual bool SetSmartColorMode(const gcmp::SmartColorMode& smartColorMode) = 0;

        /// \brief 获取当前填充区域边界线的可见性
        ///
        /// \return 可见返回true，不可见返回false
        virtual bool IsBorderVisible() const = 0;

        /// \brief 设置当前填充区域边界线的可见性
        ///
        /// \param bVisible 可见性
        virtual void SetIsBorderVisible(bool isVisible) = 0;

        /// \brief 获取填充区域边界线的样式Id
        ///
        /// \return 填充区域边界线的样式Id
        virtual gcmp::ElementId GetLineStyleId() const = 0;

        /// \brief 设置填充区域边界线的样式Id
        ///
        /// \param 填充区域边界线的样式Id
        /// \return 成功与否
        virtual bool SetLineStyleId(const gcmp::ElementId& id) = 0;

        /// \brief 获取填充图案的颜色及透明度
        ///
        /// \return 填充图案的颜色及透明度
        virtual gcmp::Color GetColor() const = 0;

        /// \brief 设置填充图案的颜色及透明度
        ///
        /// \param 填充图案的颜色及透明度
        virtual void SetColor(const gcmp::Color &color) = 0;

        /// \brief 获取填充图案的线宽
        ///
        /// \return 填充图案的线宽
        virtual double GetLineWidth() const = 0;

        /// \brief 设置填充图案的线宽
        ///
        /// \param 填充图案的线宽
        virtual void SetLineWidth(double width) = 0;

        /// \brief 获取填充模式的名字
        ///
        /// \return 填充模式的名字
        virtual std::wstring GetFillPatternName() const = 0;

        /// \brief 设置填充模式的名字
        ///
        /// \param 填充模式的名字
        virtual void SetFillPatternName(std::wstring name) = 0;

        /// \brief 获取填充区域样式Id
        ///
        /// \return 填充区域样式Id
        virtual gcmp::ElementId GetGraphicsStyleId() const = 0;

        /// \brief 设置填充区域样式Id
        ///
        /// \param 填充区域样式Id
        virtual void SetGraphicsStyleId(const gcmp::ElementId &styleElementId) = 0;

        /// \brief 获取填充区域是否遮罩
        ///
        /// \return 遮罩返回true，不遮罩返回false
        virtual bool IsMask() const = 0;
    };
}




